home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / filesyst / xiafs / xiafspgm.8 / xiafspgm / xiafspgm-0.8.1 / primary.s < prev    next >
Text File  |  1993-03-21  |  5KB  |  287 lines

  1. !-----------------------------------------------------------------------!
  2. ! primary.s                                !
  3. !                                    !
  4. !   Copyright (C) Q. Frank Xia, 1993.  All rights reserved.        !
  5. !                                    !
  6. ! This software may be redistributed as per Linux copyright        !
  7. !                                    !
  8. !-----------------------------------------------------------------------!
  9.  
  10.  
  11. BOOTSEG          =   0x07C0        ! original address of boot seg
  12. INITSEG       =   0x3000        ! we move boot here
  13. PARTTABOFF    =   0x01be        ! partition table offset
  14. OSTABOFF    =   0x017e        ! bootable OS table
  15. BOOTOFF          =   0x7c00        ! boot code offset
  16.  
  17. TIMEOUT          =   15*18        ! timeout for keyhit
  18. TIMELO          =   0x46c        ! timer count low
  19.  
  20. ZERO        =   0x30        ! ascii '0'
  21. FIVE          =   0x35        ! ascii '5'
  22.  
  23. !-------------------------------------------------------------
  24.  
  25.     .text
  26.     .globl    _main
  27. _main:
  28.  
  29.  
  30. ! move this 512 byte to INITSEG:0x0000
  31.  
  32.     mov    ax, #BOOTSEG
  33.     mov    ds, ax
  34.     mov    ax, #INITSEG
  35.     mov    es, ax
  36.     mov    cx, #256
  37.     sub    si, si
  38.     sub    di, di
  39.     cld
  40.     rep
  41.     movsw
  42.     jmpi    start, INITSEG
  43.  
  44. start:
  45.     mov    ax, cs
  46.     mov    ds, ax
  47.     mov    es, ax
  48.     mov    ss, ax
  49.     mov    sp, #0x4000        
  50.  
  51.     call    clr_screen
  52.     mov    bp, #msg_name
  53.     mov    cx, #32
  54.     call    print_string
  55.     mov    bp, #msg_crlf
  56.     mov    cx, #2
  57.     call    print_string
  58.     
  59.     call    print_OS
  60.     
  61.     mov    bp, #msg_boot
  62.     mov    cx, #7
  63.     call    print_string
  64.  
  65.     call    get_key
  66.  
  67. boot:
  68.     mov    bx, #16
  69.     mul    bx
  70.     add    ax, #boot_tab
  71.     mov     bp, ax
  72.     mov    cx, #15
  73.     call    print_string
  74.     mov    bp, #msg_crlf
  75.     mov    cx, #2
  76.     call    print_string
  77.  
  78.     add    ax, #15
  79.     mov    si, ax
  80.     movb    al, (si)        ! get partition number
  81.     xor    ah, ah
  82.     dec    ax
  83.  
  84.     mul    bx
  85.     add    ax, #part_tab
  86.     mov    si, ax
  87.     
  88.     push     si
  89.     push    cs
  90.  
  91.     xor    ax, ax
  92.     mov    es, ax
  93.     mov    bx, #BOOTOFF
  94.  
  95.     mov    ax, #0x201        ! read one sector
  96.     movb    dh, 1(si)        ! head
  97.     movb    cl, 2(si)        ! sector
  98.     movb    ch, 3(si)        ! cylinder
  99.     movb    dl, #0x80        ! disk
  100.     int    0x13
  101.  
  102.     pop    es
  103.     pop    si
  104.     jmpi    BOOTOFF, 0        ! read boot
  105.     
  106. !------------------------------------------------------------------
  107. ! print a string
  108. ! bp = address of the string to print
  109. ! cx = length of the string
  110.  
  111. print_string:
  112.     pusha
  113.     push    bp
  114.     push    cx
  115.     mov    ah, #0x03        ! read cursor pos
  116.     xor    bh, bh
  117.     int    0x10
  118.  
  119.     pop    cx
  120.     pop    bp
  121.     mov    bx, #0x0007        ! page 0, attribute 7 (normal)
  122.     mov    ax, #0x1301        ! write string, move cursor
  123.     int    0x10
  124.     popa
  125.     ret
  126.  
  127. !------------------------------------------------------------------
  128. ! print all bootable OS
  129.  
  130. print_OS:
  131.     pusha
  132.     mov    cx, #4
  133.     mov    ax, #boot_tab
  134. rept_OS:
  135.     mov    si, ax
  136.     add    si, #15
  137.     movb    dl, (si)
  138.     testb    dl, dl
  139.     jnz    more_OS
  140.     popa
  141.     ret
  142. more_OS:
  143.     mov    dx, #FIVE
  144.     sub    dx, cx
  145.     mov    msg_nr, dl
  146.     push    cx
  147.     mov    bp, #msg_head
  148.     mov    cx, #11
  149.     call     print_string
  150.  
  151.     mov    bp, ax
  152.     mov    cx, #15
  153.     call    print_string
  154.     mov    bp, #msg_crlf
  155.     mov    cx, #2
  156.     call    print_string
  157.  
  158.     pop    cx
  159.     add    ax, #16
  160.     dec    cx
  161.     jnz    rept_OS
  162.     popa
  163.     ret
  164.  
  165. !------------------------------------------------------------------
  166. ! Wait for indication of partition to boot
  167. ! return ax = ascii code of the key hit.
  168.  
  169. get_key:
  170.     xor    bx, bx
  171.     mov    fs, bx
  172.     mov    bx, #TIMEOUT        ! timeout
  173.  
  174. loadtime:
  175.     seg fs
  176.     mov    cx,TIMELO        ! load the current time
  177.  
  178. waitkey:
  179.     movb    ah,#1            ! check for keystroke
  180.     int    0x16
  181.     jnz    keyhit            ! key was struck
  182.  
  183.     seg fs
  184.     cmp    cx,TIMELO        ! check for new time
  185.     je    waitkey
  186.     dec    bx            ! wait for timeout to elapse
  187.     jnz    loadtime
  188.  
  189. timedout:
  190.     xor    ax, ax            ! get default boot partition
  191.     ret
  192.  
  193. keyhit:
  194.     xorb    ah, ah            ! read key
  195.     int    0x16
  196.     xor    ah, ah
  197.     sub    ax, #ZERO+1        ! convert partition number
  198.     jc    def
  199.     cmp    ax, #4
  200.     jnc    def
  201.     push    ax
  202.     mov    bx, #16
  203.     mul    bx
  204.     add    ax, #boot_tab+15
  205.     mov    si, ax
  206.     movb    al, (si)
  207.     testb    al, al
  208.     pop    ax    
  209.     jz    def
  210.     ret
  211.  
  212. def:
  213.     xor    ax, ax
  214.     ret
  215.  
  216. !--------------------------------------------------------------------
  217. ! clean screen
  218.  
  219. clr_screen:
  220.     pusha
  221.  
  222.     mov    ax, #0x0700
  223.     mov    bh, #0x07
  224.     mov    cx, #0
  225.     mov    dh, #24
  226.     mov    dl, #79
  227.     int    0x10
  228.  
  229.     mov    ah, #2
  230.     mov    bh, #0
  231.     mov    dx, #0
  232.     int    0x10
  233.  
  234.     popa
  235.     ret
  236.  
  237. !--------------------------------------------------------------------
  238. ! Misc message.
  239.  
  240. msg_head:
  241.     .byte    0x20, 0x20, 0x20, 0x20, 0x5b
  242. msg_nr:
  243.     .byte    0x30
  244.     .ascii    "]    "
  245.  
  246. msg_boot:
  247.     .byte    0x0a
  248.     .ascii    "Boot: "
  249.  
  250. msg_name:
  251.     .byte    0x0a
  252.     .ascii    "Frank Xia's Linux Booter v0.8"
  253.  
  254. msg_crlf:    
  255.     .byte    0x0d,0x0a
  256.  
  257. !--------------------------------------------------------------
  258. ! Bootable partitions. These fields filled by mkboot.
  259.  
  260.     .org    0x17e
  261. boot_tab:
  262.     .ascii    "Linux          "    ! string. OS name, etc. 
  263.     .byte    2            ! partition
  264.     .ascii    "MS-DOS         "    ! string. OS name, etc. 
  265.     .byte    1            ! partition
  266.     .ascii    "123456789012345"    ! string. OS name, etc. 
  267.     .byte    0            ! partition
  268.     .ascii    "123456789012345"    ! string. OS name, etc. 
  269.     .byte    0            ! partition
  270.  
  271. !--------------------------------------------------------------
  272. ! Partition table. These fields copied from old master bootsect.
  273.  
  274.     .org    0x1be
  275. part_tab:
  276.     .byte    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  277.     .long    0x00000000,0x00000000
  278.     .byte    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  279.     .long    0x00000000,0x00000000
  280.     .byte    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  281.     .long    0x00000000,0x00000000
  282.     .byte    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  283.     .long    0x00000000,0x00000000
  284.     .byte    0x55,0xAA
  285.  
  286.  
  287.